package com.wunong.smart.algorithm.simple.demo;

/**
 * @author created by zealot.zt
 */
public class MathUtils {

    /**
     * 反转数组
     *
     * @param array
     */
    public static <T> void reverse(T[] array) {
        final int len = array.length;
        for (int i = 0, size = array.length / 2; i < size; i++) {
            swap(array, i, len - i - 1);
        }
    }

    /**
     * 交互元素
     *
     * @param array
     */
    public static <T> void swap(T[] array, int from, int to) {
        T temp = array[from];
        array[from] = array[to];
        array[to] = temp;
    }

    /**
     * 反转数组
     *
     * @param array
     */
    public static <T> void reverse(char[] array) {
        final int len = array.length;
        for (int i = 0, size = array.length / 2; i < size; i++) {
            swap(array, i, len - i - 1);
        }
    }

    /**
     * 交互元素
     *
     * @param array
     */
    public static void swap(char[] array, int from, int to) {
        char temp = array[from];
        array[from] = array[to];
        array[to] = temp;
    }

    /**
     * 计算走楼梯数量
     * 走楼梯到目的地，可以一次走一步，也可以一次走两步，求所有可能的方案数
     * a[n]：代表走的第n层楼梯可能的方案数
     * a[n] = a[n - 1] + a[n - 2]
     *
     * @param n
     * @return
     */
    public static int countFloorWay(int n) {
        if (n == 1) {
            return 1;
        }

        if (n == 2) {
            return 2;
        }

        int[] array = new int[n + 1];

        array[1] = 1;
        array[2] = 2;

        for (int i = 3; i <= n; i++) {
            array[i] = array[i - 2] + array[i - 1];
        }

        return array[n];
    }

    private MathUtils() {
    }

}
